/*
 * Compresor.cpp
 *
 *  Created on: 21/06/2010
 *      Author: ignacio
 */

#include "Compresor.h"
#include <iostream>
#include <string.h>

c_aritmetico* Compresor::compresorAritmetico = NULL;

fstream* Compresor::archivoAritmetico = NULL;

char* Compresor::nombreArchivo = NULL;

void Compresor::setFile(char* rutaArchivo){



	if (compresorAritmetico){

		delete compresorAritmetico;
	}

	nombreArchivo = new char[strlen(rutaArchivo)+1];

	strcpy(nombreArchivo,rutaArchivo);
}

void Compresor::comprimir(typeCaracterChar caracter,typeFrecuencias frecuenciaCaracter, typeFrecuencias frecuenciaTotal, typeFrecuencias frecuenciaAcumulada, bool fin)
{
	if (!compresorAritmetico){

		archivoAritmetico = new fstream(nombreArchivo,ios::trunc | ios::out | ios::in);

		compresorAritmetico = new c_aritmetico();

		compresorAritmetico->SetFile(archivoAritmetico);

	}

	compresorAritmetico->comprimir(frecuenciaAcumulada,frecuenciaAcumulada+frecuenciaCaracter,frecuenciaTotal);

	std::cout << " Caracter a emitir: \"" << caracter << "\" frecuenciaCaracter: \"" << frecuenciaCaracter << "\" frecuencia Total \""<< frecuenciaTotal << "\" frecuencia Acumulada \"" << frecuenciaAcumulada <<"\"\n\n";

	if (fin){

		compresorAritmetico->comprimir_finalizar();
	}
}

typeCaracterAscii Compresor::descomprimir(typeFrecuencias frecuenciaTotal, bool fin)
{
	if (!compresorAritmetico){

		archivoAritmetico = new fstream(nombreArchivo, ios::out | ios::in);

		compresorAritmetico = new c_aritmetico();

		compresorAritmetico->SetFile(archivoAritmetico);

		compresorAritmetico->descomprimir_iniciar();

	}

	return compresorAritmetico->descomprimirTarget(frecuenciaTotal);
}

typeCaracterAscii Compresor::setFrecuenciasDescomprimir(typeFrecuencias frecuenciaCaracter, typeFrecuencias frecuenciaAcumulada){


	compresorAritmetico->descomprimir(frecuenciaAcumulada, frecuenciaAcumulada+frecuenciaCaracter);
}

void Compresor::destruirCompresor(){

	archivoAritmetico->close();

	delete compresorAritmetico;

	compresorAritmetico = NULL;

}
